package com.qcby.llmtchstd.common;

/**
 * 接口统一响应结果封装类
 * 适配《系统接口文档（优化版）》中所有接口的返回格式规范
 */
public class ResponseResult<T> {
    /**
     * 响应状态码
     * 0000: 成功
     * 4001: 账户错误
     * 4002: 密码错误
     * 4003: 参数错误
     * 4004: 电话重复
     * 5001: 数据库异常
     * 5002: 第三方接口失败
     * 7777: 未登录
     * 7778: 登录过期
     * 7779: 权限不足
     */
    private String code;

    /**
     * 响应消息
     */
    private String msg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 私有构造方法，禁止直接实例化
     */
    private ResponseResult() {}

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
    /**
     * 成功响应（无数据）
     * @return 响应结果
     */
    public static <T> ResponseResult<T> success() {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode("0000");
        result.setMsg("操作成功");
        result.setData(null);
        return result;
    }



    /**
     * 成功响应（带数据）
     * @param data 响应数据
     * @return 响应结果
     */
    public static <T> ResponseResult<T> success(T data) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode("0000");
        result.setMsg("操作成功");
        result.setData(data);
        return result;
    }

    /**
     * 成功响应（自定义消息+数据）
     * @param msg 自定义消息
     * @param data 响应数据
     * @return 响应结果
     */
    public static <T> ResponseResult<T> success(String msg, T data) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode("0000");
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    /**
     * 失败响应（自定义状态码+消息）
     * @param code 状态码
     * @param msg 错误消息
     * @return 响应结果
     */
    public static <T> ResponseResult<T> fail(String code, String msg) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }

    /**
     * 失败响应（自定义状态码+消息+数据）
     * @param code 状态码
     * @param msg 错误消息
     * @param data 错误相关数据
     * @return 响应结果
     */
    public static <T> ResponseResult<T> fail(String code, String msg, T data) {
        ResponseResult<T> result = new ResponseResult<>();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return result;
    }

    // 常用错误类型快捷方法
    public static <T> ResponseResult<T> accountError() {
        return fail("4001", "账户错误（用户名不存在或已被禁用）");
    }

    public static <T> ResponseResult<T> passwordError(String msg) {
        return fail("4002", msg);
    }

    public static <T> ResponseResult<T> paramError(String msg) {
        return fail("4003", msg);
    }

    public static <T> ResponseResult<T> dbError(String msg) {
        return fail("5001", msg);
    }

    public static <T> ResponseResult<T> thirdPartyError(String msg) {
        return fail("5002", msg);
    }

    public static <T> ResponseResult<T> notLogin() {
        return fail("7777", "未登录（请先登录）");
    }

    public static <T> ResponseResult<T> loginExpired() {
        return fail("7778", "登录过期（需重新登录）");
    }

    public static <T> ResponseResult<T> noPermission() {
        return fail("7779", "权限不足（无操作权限）");
    }
}
